package third

/*
	输入一个链表的头节点，从尾到头反过来返回每个节点的值（用数组返回）。

	示例 1：

	输入：head = [1,3,2]
	输出：[2,3,1]

	限制：

	0 <= 链表长度 <= 10000

	来源：力扣（LeetCode）
	链接：https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof
	著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/
func reversePrint(head *ListNode) []int {
	// 反转链表
	// 输出
	nHead := reverseList(head)
	res := make([]int, 0)
	for nHead != nil {
		res = append(res, nHead.Val)
		nHead = nHead.Next
	}
	return res
}

func reverseList(head *ListNode) *ListNode {
	if nil == head || head.Next == nil {
		return head
	}
	newHead := reverseList(head.Next)
	head.Next.Next = head
	head.Next = nil
	return newHead
}

func reverseList1(head *ListNode) *ListNode {
	if nil == head {
		return head
	}

	var pre *ListNode
	for head != nil {
		next := head.Next
		head.Next = pre
		pre = head
		head = next
	}
	return pre
}
